//
// Created by Jisam on 2024/7/29 20:24.
// solve D. 小红组比赛2
#include <bits/stdc++.h>

#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>

#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
using u32 = unsigned;
using i64 = long long;
using u64 = unsigned long long;

using namespace std;

/**
 * @brief solve 函数用于解决一个零一背包问题的变种。
 *          给定一个矩阵，其中每一行代表一组可选的物品，每一列代表一个物品的不同价值，
 *          和一个目标值target，寻找一个组合，使得这个组合的总价值最接近target。
 *
 * @details
 *          该函数首先读取输入的矩阵和目标值，然后计算所有可能的最大价值总和。
 *          接着初始化动态规划数组，并通过动态规划算法填充这个数组。
 *          最后，遍历动态规划数组，找到最接近目标值的实际价值。
 *
 * @return void
 */
void solve() {
    // 读入矩阵的行数n和列数m
    int n, m;
    cin >> n >> m;

    // 初始化矩阵g，存储每行的物品价值
    vector<vector<int>> g(n, vector<int>(m));

    // 从标准输入读取每行的物品价值
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> g[i][j];
        }
    }

    // 读入目标值target
    int target;
    cin >> target;

    // 计算所有行的最大价值之和，作为背包的最大容量MX
    int MX = 0;
    for (const auto &row : g) {
        MX += *max_element(row.begin(), row.end());
    }

    // 初始化动态规划数组dp，dp[i]表示是否可以凑出总价值i
    vector<bool> dp(MX + 1, false);
    dp[0] = true;

    // 动态规划过程：对于每一行，更新dp数组，检查是否可以凑出新的价值
    for (int i = 0; i < n; ++i) {
        vector<bool> dp2(MX + 1, false);
        for (int v : g[i]) {
            for (int k = MX - v; k >= 0; --k) {
                if (dp[k]) {
                    dp2[k + v] = true;
                }
            }
        }
        dp = dp2; // 更新dp数组
    }

    // 寻找最接近target的背包容量：遍历dp数组，找到最接近target的实际价值
    int ans = numeric_limits<int>::max();
    for (int i = 0; i <= MX; ++i) {
        if (dp[i]) {
            ans = min(ans, abs(target - i));
        }
    }

    // 输出结果：最接近目标值的实际价值与目标值的差值
    cout << ans << endl;
}


int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T = 1;
//    cin >> T;
    while (T--) solve();
//    cout << "\n"[];
    return 0;
}